'''
第9次作业：
给定一个经过编码的字符串，返回它解码后的字符串。
编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。
此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。
示例:
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
s = "3[ab2[cd]]ef" :return "abcdcd""abcdcd"abcdcd"ef
dcdcbadcdcbadcdcba ef
abcabcabc cdcdcd ef
cbacbacba dcdcdc

'''

def a(src:str):
    stack = []
    num = ''        #   计算[]内str重复次数
    ret = ''        #   最终返回值
    tmp = ''        #   临时存储重复后的str
    for i in range(len(src)):
        stack.append(src[i])
        if stack[-1] ==']':
            tmp,stack = _get_str(stack,tmp) # 此段收集被重复str
            num,stack = _get_dig(stack,num) # 此段收集重复次数
            if len(stack)==0:   # 因为使用栈，所以重复后的顺序是完全相反的，（每一段，一阶括号同级内完全相反，）
                                    #     （）（）（），三个括号内完全相反，括号间不影响，每一个括号的计算都会清空栈，
                ret += (num*tmp)[::-1]
                tmp = num = ''
            else:
                tmp = num*tmp
                num = ''
    return ret
def _get_str(stack:list,tmp):
    stack.pop()
    while stack[-1] != '[':  # 此段收集被重复str
        tmp += stack.pop()
    stack.pop()
    return tmp,stack
def _get_dig(stack:list,num):
    while stack[-1].isdigit():  # 此段收集重复次数
        num = int(stack.pop() + str(num))
        if not stack:
            break
    return num,stack
# s = "3[a]2[bc]"
# s = "3[a2[c]]"
# s = "2[abc]3[cd]ef"
s = "3[ab2[cd]]ef"
print(a(s))

# 用正则试试？